package cenas;

import pi.beta.CaoGuia;
import pi.beta.CaoGuia.Estado;
import pi.beta.DeteccoesDeColisao;
import pi.beta.Dono;
import pi.beta.GerenciamentoDeCenasEEntrada;
import assets.Cenario;
import assets.Som;
import gatilhos.*;
import obstaculos.*;

import org.anddev.andengine.audio.sound.SoundManager;
import org.anddev.andengine.engine.handler.IUpdateHandler;
import org.anddev.andengine.entity.scene.Scene;
import org.anddev.andengine.entity.sprite.Sprite;
import org.anddev.andengine.input.touch.TouchEvent;
import org.anddev.andengine.opengl.texture.TextureManager;
import org.anddev.andengine.opengl.texture.TextureOptions;
import org.anddev.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlas;
import org.anddev.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlasTextureRegionFactory;
import org.anddev.andengine.opengl.texture.region.TextureRegion;

import android.content.Context;
import android.util.Log;

import java.util.ArrayList;

public class Nivel extends Scene {

	public int largura;
	public int altura;
	public Cenario cenario;
	public Dono dono;
	public CaoGuia caoGuia;

	Context contexto;

	public GerenciamentoDeCenasEEntrada trocaDeCenas;
	
	public Som colisaoComGatilho, dano;
	
	public ArrayList<Sprite> vidasMostradasNaTela = new ArrayList<Sprite>();
	public Sprite esquerda, direita;
	
	private BitmapTextureAtlas mapaDeTexturas, mapaEsquerda, mapaDireita;
	private TextureRegion texturaVida, texturaEsquerda, texturaDireita;
	
	public DeteccoesDeColisao deteccoesDeColisao;

	public Nivel(GerenciamentoDeCenasEEntrada trocaDeCenas, Context contexto, int largura, int altura, TextureManager tm, SoundManager sm){
		this.contexto = contexto;
		this.largura = largura;
		this.altura = altura;
		this.trocaDeCenas = trocaDeCenas;
		cenario = new Cenario("Cenario.png", "Nivel 1.tmx", this, contexto, tm);
		dono = new Dono("Dono.png", this, contexto, tm);
		caoGuia = new CaoGuia("Cao guia.png", this, contexto, tm);
		colisaoComGatilho = new Som("Gatilho.ogg", contexto, sm);
		dano = new Som("Dano.ogg", contexto, sm);
		
		mapaDeTexturas = new BitmapTextureAtlas(1024, 512, TextureOptions.BILINEAR_PREMULTIPLYALPHA);
		BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/");
		texturaVida = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mapaDeTexturas, contexto, "Vida.png", 0, 0);
		tm.loadTexture(mapaDeTexturas);
		
		for(int i = 0; i < caoGuia.vidas+1; i++){
			vidasMostradasNaTela.add(new Sprite(largura - (i*64), 0, texturaVida));
			attachChild(vidasMostradasNaTela.get(i));
		}
		
		mapaEsquerda = new BitmapTextureAtlas(128, 64, TextureOptions.BILINEAR_PREMULTIPLYALPHA);
		BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/");
		texturaEsquerda = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mapaEsquerda, contexto, "Esquerda.png", 0, 0);
		tm.loadTexture(mapaEsquerda);
		
		mapaDireita = new BitmapTextureAtlas(128, 64, TextureOptions.BILINEAR_PREMULTIPLYALPHA);
		BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/");
		texturaDireita = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mapaDireita, contexto, "Direita.png", 0, 0);
		tm.loadTexture(mapaDireita);
		
		esquerda = new Sprite(0, 384, texturaEsquerda);
		direita = new Sprite(128, 384, texturaDireita);
		attachChild(esquerda);
		attachChild(direita);
		
		deteccoesDeColisao = new DeteccoesDeColisao(caoGuia, dono, cenario.colisoesCaoGuia, cenario.colisoesDono, cenario.obstaculos, cenario.gatilhos);
		
		registerUpdateHandler(loop);
	}
	
	IUpdateHandler loop = new IUpdateHandler() {
		@Override
		public void reset() {
		}
		
		@Override
		public void onUpdate(float arg0) {
			cenario.posicionaNaCena((int)caoGuia.x+(caoGuia.LARGURA/2)-(largura/2),0);//(int)caoGuia.y-(altura/2));
			caoGuia.atualiza();
			dono.atualiza();
			for(Obstaculo obstaculo : cenario.obstaculos){
				obstaculo.atualiza();
			}
			for(Gatilho gatilho : cenario.gatilhos){
				gatilho.atualiza();
			}
			deteccoesDeColisao.atualiza(dano, trocaDeCenas.botaoPulo);
			dono.posicionaNaCena(cenario.MapX,cenario.MapY);
			caoGuia.posicionaNaCena(cenario.MapX,cenario.MapY);
			if(dono.y > altura){
				//caoGuia.vidas = 0;
			}
			if(caoGuia.vidas == 0){
				trocaDeCenas.carregaCena(trocaDeCenas.MENU_PRINCIPAL);
			}
		}
	};
	
	public void trataInput(){
		if(trocaDeCenas.botaoEsquerdo || trocaDeCenas.botaoDireito){
			if(trocaDeCenas.botaoEsquerdo == true){
				caoGuia.atualizaSprite(Estado.ANDANDO, true, true);//true = esquerda
				move(true);
				trocaDeCenas.botaoEsquerdo = false;
			}
			if(trocaDeCenas.botaoDireito == true){
				caoGuia.atualizaSprite(Estado.ANDANDO, false, true);//false = direita
				move(false);
				trocaDeCenas.botaoDireito = false;
			}
		}
		if(trocaDeCenas.botaoPulo){
			caoGuia.pula();
			trocaDeCenas.botaoPulo = false;
		}
	}
	
	public void recuperaSpriteParado(){
		caoGuia.atualizaSprite(Estado.PARADO, true, false);
	}
	
	public void move(boolean direcao){
		caoGuia.move(direcao);
		caoGuia.posicionaNaCena(cenario.MapX,cenario.MapY);
	}
	
	@Override
	public boolean onSceneTouchEvent(TouchEvent toque) {
		//return super.onSceneTouchEvent(pSceneTouchEvent);
		if (toque.getAction() == TouchEvent.ACTION_DOWN) {
			if(toque.getX() < 128 && toque.getY() > 384){// && toque.getY() < 320) {
				trocaDeCenas.ativaBotaoEsquerdo();
			}
			if(toque.getX() > 128 && toque.getX() < 256 && toque.getY() > 384){// && toque.getY() < 320) {
				trocaDeCenas.ativaBotaoDireito();
			}
			return true;
		}
		trocaDeCenas.desativaBotoesDirecionais();
		return false;
	}
}